# -*- coding: utf-8 -*-
# @Time: 2021/10/28 20:10
# @Author: jiuwu
# @Email: 2359196586@qq.com
# @File: serializers.py
# @Software: PyCharm

"""
    序列化器：
        本质就是一个类，和模型类差不多
        用于json格式与模型对象互转以及校验数据

        定义的属性就是要参与转换的字段

        序列化器字段可以少于或多于模型类字段 没有的字段前端就看不到 增加字段就需要自己定义
        但是字段名需要保持一致

        定义返回的数据有哪些字段

"""
from rest_framework import serializers
from rest_framework.relations import StringRelatedField

from .models import Student, Classes


# 定义一个序列化器类  学生序列化器

# class StudentSerializer(serializers.Serializer):
#     # 与模型类对比 要把 models改成 serializers，verbose_name改成label ,null为True相当于required=False,blank去掉
#     SEX_CHOICES = (
#         (0, '女'),
#         (1, '男')
#     )
#     id = serializers.IntegerField(label='ID',read_only=True)  #设置了read_only在做校验的时候不能去修改id
#     name = serializers.CharField(max_length=30, label='姓名')
#     age = serializers.IntegerField(label='年龄', required=False)
#     sex = serializers.IntegerField(label='性别', required=False, choices=SEX_CHOICES)
#     create_time = serializers.DateTimeField(label='创建时间', auto_now_add=True)
#     update_time = serializers.DateTimeField(label='更新时间', auto_now=True)
#     is_delete = serializers.BooleanField(default=False, label='逻辑删除')

# ModelSerializer

class StudentSerializer(serializers.ModelSerializer):
    # 可以查询学生显示班级
    # classes = StringRelatedField(read_only=True)

    # 不用写字段，但是要定义元信息类，告诉它是哪个模型类
    class Meta:
        model = Student  # 指定序列化器映射的模型类
        # 注意，当模型类字段的null=True，序列化器fields是all的时候，用户可以不传改值（post添加数据时）
        fields = '__all__'  # fields指定映射字段   __all__表示所有字段
        # fields = ['id','name','age'] # 只映射这三个字段
        # exclude = ['id']  # 映射除3id字段之外的所有字段
        extra_kwargs = {
            'age': {'min_value': 0, 'max_value': 200},
            # 'sex': {'required': True},

        }

    #  下面两个是反序列化 传值时候的校验  json转模型对象 用户传入的是json形式的数据

    # 还可以追加额外的校验逻辑 对name校验 对单个属性校验用这种方式
    # def validate_name(self, value):
    #     if 'python' not in value.lower():
    #         # 统一抛校验异常
    #         raise serializers.ValidationError('name error')
    #     return value

    # 对象级别的校验用这种 两者都是生命周期函数  用于多个数据校验
    # def validate(self, data):
    #     if 'python' not in data['name'].lower():
    #         raise serializers.ValidationError('name error')
    #     return data


class ClassesSerializer(serializers.ModelSerializer):
    # 实现查询班级的时候，出现该班级的学生,反向查询，外键在学生表中，增加一个序列化器字段
    # 反向查询得到的是Sutdent的所有信息，模型对象，进行序列化
    student_set = StudentSerializer(many=True)

    class Meta:
        model = Classes
        fields = '__all__'

    def validate_name(self,value):
        if '码趣教育' not in value:
            raise serializers.ValidationError('班级名需要带有码趣教育')
        return value
